#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' 用于添加机器人功能'
import datetime

__author__ = 'Lucky Xiong'

# 进场欢迎 、 礼物提醒、 入场提醒、  点播提醒、  语音播报、 礼物计数、 场控 、 图灵机器
# 礼物截图 ,  积分

# 语音识别，  关闭声音提醒， 开启声音。。。


# 点歌助手 :  展示在客户端, 通过删除按钮排除队列
import functools
import json
import threading
import time
import pickledb
from selenium.webdriver.support.wait import WebDriverWait

'''
✨🌸欢迎新进直播间小伙伴
      点歌请看背景歌单
      点关注即可点歌
喜欢点点关注❤️投喂下小礼物
一颗药丸💊也是爱哟🥰🐳🌸
——————————————
 累计送六块礼物可获得主播 
      可爱的粉丝牌子哟
'''


def synchronized(func):
    @functools.wraps(func)
    def wrapper(self, *args, **kwargs):
        with self.lock:
            return func(self, *args, **kwargs)

    return wrapper


# 蟹蟹老板 提前祝老板新年快乐 打麻将一直糊
# 斗地主把把俩王四个二
# 管理员
admin = {'2802135': 'LuckyXiong', '8051711': 'RobotXiong'}


class robot:

    def __init__(self, driver):
        self.driver = driver
        self.lock = threading.Lock()

        # 一直等待主播开播 ，也就是说页面上没有返回直播间首页 的超链接
        print('检查是否开播...')
        WebDriverWait(self.driver, timeout=3600 * 10).until_not(
            lambda x: x.find_element_by_xpath('//*[@id="RoomClose"]/div/a[2]'))
        print('主播已开播')
        # self.inputext = driver.find_element_by_css_selector('#Chatroom > div.input-container > input')
        # self.sendBtn = driver.find_element_by_css_selector('#Chatroom > div.input-container > button.btn.btn-send')
        self.inputextCss = '#Chatroom > div.input-container > input'
        self.sendBtnCss = '#Chatroom > div.input-container > button.btn.btn-send'
        self.joinNameXpath = '//*[@id="ChatBox"]/div[2]/div/div[3]'
        self.msgBoxXpath = '//*[@id="ChatBox"]/div/div'
        self.joins = {}  # 短期内加入的人。
        self.gifts = {}  # 短期内的礼物。
        """TODO: 应用客户端填入数据，管理节目单   
            “小耳朵点歌前可以先@我，查询歌单中是否存在哦~  格式如下 @RobotXiong 点播-歌曲名（或者项目名）”
        """
        self.sheet = []  # 节目单。
        """ TODO: 点歌列表需要注意 ， 由主播或房管确认。"""
        self.SongList = []  # 点歌列表。
        # 加载数据库
        print('开始加载本地db...')
        date = datetime.datetime.now().strftime('%Y-%m-%d')
        self.unkey = 'unDeal%s' % date
        self.db = pickledb.load('undeal.db', True)
        if not self.db.exists(self.unkey):
            list_ = self.db.lcreate(self.unkey)  # 创建 ws _ list
        if not self.db.exists('sheet'):
            list_ = self.db.lcreate('sheet')  # 创建 sheet 节目单
        '''超时弹框
            '好像连不上直播呢。'
            'IM 连接超时'
            #ModalMessageBox > div.content > div.action > button  
        '''
        self.imTimeoutCss = '#ModalMessageBox > div.content > div.action > button'
        # 是否需要模拟休息？抓包之后是否也需要模拟sleep？

    @synchronized
    def send(self, str):
        self.driver.find_element_by_css_selector(self.inputextCss).send_keys(str)
        self.driver.find_element_by_css_selector(self.sendBtnCss).click()
        print('机器人发送弹幕 : %s' % str)

    def isElementExist(self, element):
        """判断页面是否存在元素  CSS 选择器"""
        flag = True
        browser = self.driver
        try:
            browser.find_element_by_css_selector(element)
            return flag

        except:
            flag = False
            return flag

    def lookDanmu(self):
        print('机器人看到了：')
        father = self.driver.find_element_by_xpath('msgBoxXpath')
        father.find_element_by_css_selector('.message')

    '观察进入的人'

    # def lookIn(self):
    #     # 该方法判断元素是否出现 , 第二个参数为等待时间
    #     '''WebDriverWait:这个类的运作流程就是，程序每过一段时间就检查一次，如果条件成立就执行下一步，如果条件不成立，继续等待，直到超过最大等待时间，抛出TimeoutException'''
    #     try:
    #         print('开始等待元素出现')
    #         WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(self.joinNameXpath))
    #         print(self.driver.find_element_by_xpath(self.joinNameXpath).text)
    #         who = self.driver.find_element_by_xpath(self.joinNameXpath).text
    #         print('获取dict', self.joins.get(who))
    #         # 判断是否已经欢迎
    #         print(self.joins)
    #         if self.joins.get(who) is None:
    #             msg = '欢迎进来的新宝贝，%s' % who
    #             self.send(self.welcome)
    #             self.send(msg)
    #             self.joins[who] = time.time()
    #         elif time.time() - self.joins.get(who) > 10:  # 大于10S后删除
    #             self.joins.pop(who)
    #
    #     except Exception as e:
    #         print('前10s没有进入人')
    #         print(e)  # 打印所有异常到屏幕

    def route(self, msg):
        # 关闭弹窗
        if self.isElementExist(self.imTimeoutCss):
            self.driver.find_element_by_css_selector(self.imTimeoutCss).click()
        print('----', msg)
        print('robot接收到的msg类型是：', type(msg))
        jsonObj = json.loads(msg)
        print('本次获得的json: ', jsonObj)
        print('类型是：', type(jsonObj))
        print('~~~~~~~~~~进入路由~~~~~~~~~')
        if 'event' in jsonObj:
            print('正常数据')
            event = jsonObj['event']
            type2 = jsonObj['type']
            if event == 'statistics':
                if type2 == 'room':
                    '''更新房间数据'''
                    pass
                else:
                    self.undeal(jsonObj)
            elif event == 'join_queue':
                if type2 == 'member':
                    '''有人加入'''
                    self.lookIn2(jsonObj)
                else:
                    self.undeal(jsonObj)
            elif event == 'followed':
                if type2 == 'member':
                    '''有人关注'''
                    self.followed(jsonObj)
                else:
                    self.undeal(jsonObj)
            elif event == 'send':
                if type2 == 'gift':
                    '''送礼物'''
                    self.gift(jsonObj)
                else:
                    self.undeal(jsonObj)
            elif event == 'creator':
                '''尚不明确'''
        else:
            print('其他类型数据')

    '连接百度语音API'

    '''第二代欢迎进入'''

    def lookIn2(self, json):
        users = json['queue']
        for user in users:
            name = user['username']
            titles = ''
            if name != '':
                titles = user['titles']  # 相应的身份
            user_id = user['user_id']
            print('用户id为(number类型)：', user_id)
            if str(user_id) in admin:
                print('admin不欢迎了吧？')
                continue
            else:
                noble = ''
                # 判断是否已经欢迎
                if self.joins.get(name) is None:
                    for title in titles:
                        if title['type'] == 'noble':
                            # 如果是有身份的，欢迎词加上
                            noble = '✨ %s ✨' % title['name']
                    welcome = '欢迎{}  {}  进入直播间~'.format(noble, name)
                    self.send(welcome)
                    self.joins[name] = time.time()
                elif time.time() - self.joins.get(name) > 10:  # 大于10S后删除
                    '''TODO：
                        循环遍历values ， 大于10s的全部删除。 （如果内存影响不大，可以忽略。）
                    '''
                    self.joins.pop(name)
        print('欢迎完毕')

    '''感谢关注'''

    def followed(self, json):
        userName = json['user']['username']
        msg = '感谢 {} 的关注✨✨'.format(userName)
        self.send(msg)

    '''礼物感谢'''

    def gift(self, json):
        userName = json['user']['username']
        giftName = json['gift']['name']
        giftLevel = json['gift']['gift_id']
        msg = ''
        if giftLevel > 5:
            msg = '感谢 {} 的 {} ✨✨ ✨✨ 非常感谢您对主播的支持~'.format(userName, giftName)
        else:
            msg = '感谢 {} 的{}✨ 谢谢支持~'.format(userName, giftName)

        """  防止多次单击礼物造成的刷屏 """
        # 判断是否5S内送过相同礼物  userName-giftName 的形式作为主键
        key = userName + '-' + giftName
        needSend = True
        if self.gifts.get(key) is None:
            self.joins[key] = time.time()
        elif time.time() - self.joins.get(key) > 5:  # 大于5S后删除
            '''
                循环遍历values ， 大于5s的全部删除。 （如果内存影响不大，可以忽略。）
            '''
            self.joins.pop(key)
        else:
            # 以上都不是则不发送消息
            needSend = False
        # 验证是否需要发送
        if needSend:
            self.send(msg)

    '''记录没有处理的数据'''

    def undeal(self, json):
        self.db.ladd(self.unkey, json)

    def talk(self):
        pass
